// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器
import axios from 'axios'
import store from '@/store'
import { getTokenTimeStamp } from './auth'
import router from '@/router'
// 创建一个axios的实例
const service = axios.create({
  // 配置基axios的地址
  // http://localhost:8888/api/sys/login  后面的请求路径会根据发送时候的请求路径  进行变动
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000 // 设置网络请求超时时间,单位毫秒 当前设置的是5s(秒),如果请求时间超过5s就会直接报错
})

// 添加请求拦截器

service.interceptors.request.use(function(config) {
  // console.log('所有正常的请求在到达服务器之前都会经过这里', config)
  // 在发送请求之前做些什么
  // 设置  token 过期时间
  const ExpirationTime = 60 * 60
  // 这个函数是用来检查 token 是否过期   返回值false ||true
  function isCheckTime() {
    // 获取现在的时间戳
    const date = Date.now()
    // (现在的时间 - 存储token的时间) /1000  > ExpirationTime
    // 如果  > 就是  touken  过期了
    // 返回结果是 true 说明toke过期, 否则 有效没有过期
    return (date - getTokenTimeStamp()) / 1000 > ExpirationTime
  }
  // 判断是否已经登陆,如果已经登陆,直接获取token
  const token = store.state.user.token
  if (token) {
    // 首先需要确定 有token,然后再检查token有没有过期
    if (isCheckTime()) {
      // isCheckTime()的 返回值 true || false 如果代码走到这里面说明  token 过期了
      // 进入这里面代表token过期了
      // 清空token
      store.commit('user/delToken')
      // 清空用户信息
      store.commit('user/delInfo')
      // 跳转到登录页
      router.push('/login')
      // 手动抛出一个错误提示
      return Promise.reject(new Error('token过期了请重新登陆'))
    }
    // console.log(config)
    // 在请求的 headers 中统一携带 token
    config.headers.Authorization = `Bearer ${token}`
  }
  // config 是请求对象,此对象转发给服务器
  return config
}, function(error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
service.interceptors.response.use(function(response) {
  // 对响应数据做点什么
  // console.log('所有正常的响应再返回浏览器之前都会经过这里', response)
  // 1 判断请求是否业务错误, response.data.success = false
  if (!response.data.success) {
    return Promise.reject(new Error(response.data.message))
  }
  // 返回正常的响应数据----->>   返回给浏览器,浏览器中执行的程序
  return response.data
}, function(error) {
  // 对响应错误做点什么
  // console.log('服务器所有的错误响应,在到大浏览器之前都会经过这里',  error.response)
  // 判断是否是401错误,如果是说明token失效了,退出登录,重新登录
  if (error.response.status === 401 && error.response.data.code === 10002) {
    // 进入这里面代表token出了问题
    // 清空token
    store.commit('user/delToken')
    // 清空用户信息
    store.commit('user/delInfo')
    // 跳转到登录页
    router.push('/login')
    console.log(error.response.data.message)
    // 手动抛出一个错误提示
    return Promise.reject(new Error('token过期了请重新登陆'))
  }
  return Promise.reject(error)
})
export default service // 导出axios实例
